// Tencent is pleased to support the open source community by making sluaunreal available.

// Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved.
// Licensed under the BSD 3-Clause License (the "License"); 
// you may not use this file except in compliance with the License. You may obtain a copy of the License at

// https://opensource.org/licenses/BSD-3-Clause

// Unless required by applicable law or agreed to in writing, 
// software distributed under the License is distributed on an "AS IS" BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and limitations under the License.

#pragma once

#include "CoreMinimal.h"
#include "lua/lua.hpp"
#include "LuaDelegate.generated.h"

namespace slua {
    class LuaVar;
}

UCLASS()
class SLUA_UNREAL_API ULuaDelegate : public UObject {
    GENERATED_UCLASS_BODY()
public:
    UFUNCTION(BlueprintCallable, Category="Lua|Delegate")
	void EventTrigger();

    ~ULuaDelegate();

    virtual void ProcessEvent( UFunction* Function, void* Parms );
    void bindFunction(slua::lua_State *L, int p, UFunction *func);
    void bindFunction(slua::lua_State *L, int p);
    void bindFunction(UFunction *func);
	void dispose();

#if WITH_EDITOR
	void setPropName(FString name) {
		pName = name;
	}

	FString getPropName() {
		return pName;
	}
#endif

private:
    slua::LuaVar* luafunction;
    UFunction* ufunction;
#if WITH_EDITOR
	FString pName;
#endif
};

namespace slua {

    class LuaMultiDelegate {
    public:
        static int push(lua_State* L,FMulticastScriptDelegate* delegate,UFunction* ufunc, FString pName);
    private:
        static int setupMT(lua_State* L);
        static int instanceIndex(lua_State* L);
        static int Add(lua_State* L);
        static int Remove(lua_State* L);
        static int Clear(lua_State* L);
        static int gc(lua_State* L);
    };

	class LuaDelegate {
	public:
		static int push(lua_State* L, FScriptDelegate* delegate, UFunction* ufunc, FString pName);
	private:
		static int setupMT(lua_State* L);
		static int instanceIndex(lua_State* L);
		static int Bind(lua_State* L);
		static int Clear(lua_State* L);
		static int gc(lua_State* L);
	};
}

